#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct car{
    int d,v,a;
    int l,r;
}c[N];
struct lenth{
    int l[N],r[N];
}len;
bool cmp(car x,car y){
    if(x.l==y.l) return x.r<y.r;
    return x.l<y.l;
}
int p[N];
void solve(){
    int n,m,l,v;
    cin>>n>>m>>l>>v;
    for(int i=1;i<=n;i++)
        cin>>c[i].d>>c[i].v>>c[i].a;
    for(int i=1;i<=m;i++)
        cin>>p[i];
    int ans=0;
    for(int i=1;i<=n;i++){
        if(c[i].a==0){
            if(c[i].v<=v) c[i].l=c[i].r=-1;
            if(c[i].v>v){
                c[i].l=lower_bound(p+1,p+m+1,c[i].d)-p;
                c[i].r=m;
                ans++;
                if(c[i].l>m){
                    c[i].l=c[i].r=-1;
                    ans--;
                }
            }
        }
        if(c[i].a<0){
            if(c[i].v<=v) c[i].l=c[i].r=-1;
            if(c[i].v>v){
                ans++;
                double x=((v*v)-(c[i].v*c[i].v))/(2*c[i].a*1.0);
                c[i].l=lower_bound(p+1,p+m+1,c[i].d)-p;
                c[i].r=lower_bound(p+1,p+m+1,c[i].d+x)-(p+1);
                if(p[c[i].l]>=x+c[i].d){
                    ans--;
                    c[i].l=c[i].r=-1;
                    }
                }
        }
        if(c[i].a>0){
            if(c[i].v>v) {
                c[i].l=lower_bound(p+1,p+m+1,c[i].d)-p;
                c[i].r=m;
                ans++;
                if(c[i].l>m){
                    c[i].l=c[i].r=-1;
                    ans--;
                }
            }
            if(c[i].v<=v){
                double x=((v*v)-(c[i].v*c[i].v))/(2*c[i].a*1.0);
                c[i].l=upper_bound(p+1,p+m+1,c[i].d+x)-p;
                c[i].r=m;
                ans++;
                if(c[i].l>m) {c[i].l=c[i].r=-1;ans--;}
            }
        }
    }
    sort(c+1,c+n+1,cmp);
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(c[i].l==-1&&c[i].r==-1) continue;
        bool flag=false;
        for(int j=1;j<=cnt+1;j++){
            if(j==cnt+1){
                flag=true;
                len.l[j]=c[i].l;
                len.r[j]=c[i].r;
                break;
            }
            if(c[i].l>len.r[j]||c[i].r<len.l[j]) continue;
            if(c[i].l<=len.l[j]&&c[i].r>=len.r[j]) break;
            if(c[i].l<=len.r[j]&&c[i].r>=len.l[j]){
                len.l[j]=max(len.l[j],c[i].l);
                len.r[j]=min(len.r[j],c[i].r);
                break;
            }
        }
        if(flag) cnt++;
    }
    // for(int i=1;i<=n;i++)
    //     cout<<c[i].l<<" "<<c[i].r<<endl;
    cout<<ans<<" "<<(m-cnt)<<endl;
    return ;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}